package com.peng.crm.settings.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.peng.crm.commons.exception.CustomException;
import com.peng.crm.commons.utils.DateUtil;
import com.peng.crm.commons.utils.MD5Util;
import com.peng.crm.commons.utils.UUIDUtil;
import com.peng.crm.settings.dao.UserDao;
import com.peng.crm.settings.entity.DicValue;
import com.peng.crm.settings.entity.User;
import com.peng.crm.settings.service.DicValueService;
import com.peng.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用户表(User)表服务实现类
 *
 * @author makejava
 * @since 2022-06-27 15:44:00
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private DicValueService dicValueService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public User findById(String id) {
        return userDao.selectById(id);
    }

    /**
     * 通过用户名查询单条数据
     *
     * @param loginAct 用户名
     * @return 实例对象
     */
    @Override
    public User findByLoginAct(String loginAct) {
        return userDao.selectByLoginActUser(loginAct);
    }

    /**
     * 分页查询
     *
     * @param pageNumber 当前页码
     * @param pageSize 每页条数
     * @param user 筛选条件
     * @return 查询结果
     */
    @Override
    public Map<String, Object> listPage(Integer pageNumber, Integer pageSize,User user) {
        PageHelper.startPage(pageNumber,pageSize);
        PageInfo<User> pageInfo = new PageInfo<>(userDao.select(user));
        Map<String, Object> pageMap = new HashMap<>();


        //根据用户的lockstate 去设置返回的字典值 的两种方式
        //第一种普通for循环
        // List<User> list = pageInfo.getList();
        // for (User item : list) {
        //     DicValue param = new DicValue();
        //     param.setTypeCode("lockState");
        //     //拿到字典编码类型，外键为lockState的所有数据
        //     List<DicValue> dicValueslist = dicValueService.list(param);
        //     for (DicValue dicValue : dicValueslist) {
        //         if (dicValue.getValue().equals(item.getLockState())){
        //             item.setLockState(dicValue.getText());
        //         }
        //     }
        // }

        //第二种使用lambda表达式做
        pageMap.put("list",pageInfo.getList().stream().map(a -> {
            DicValue param = new DicValue();
            param.setTypeCode("lockState");
            //拿到字典编码类型，外键为lockState的所有数据
            List<DicValue> dicValueslist = dicValueService.list(param);
            //拿着上面取到的数据的value值跟用户表lock_state值对比取到第一个数据赋值给对象
            //dicValueslist.stream(转成stream流).filter过滤(e -> e.getValue().equals(a.getLockState())).拿第一个findFirst().get();
            DicValue dicValue = dicValueslist.stream().filter(e -> e.getValue().equals(a.getLockState())).findFirst().get();
            //设置user对象的锁定状态为字典表的text文本
            a.setLockState(dicValue.getText());
            //简单点写
            // DicValue dicValue = dicValueService.findTypeCode("lockState", a.getLockState());
            a.setLockState(dicValue.getText());
            return a;
        }).collect(Collectors.toList()));

        pageMap.put("total",pageInfo.getTotal());
        return pageMap;
    }

    /**
     * 查询所有用户信息
     *
     * @return  查询结果集
     */
    @Override
    public List<User> list() {
        return userDao.select(null);
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return true 或 false
     */
    @Override
    public boolean save(User user) {
        //判断用户名是否重复
        User dbuser = userDao.selectByLoginActUser(user.getLoginAct());
        if (dbuser != null){
            //使用自定义异常抛出
            throw new CustomException(-2,"用户名已存在");
        }
        //手动维护ID
        user.setId(UUIDUtil.getUUID());
        //密码加密
        user.setLoginPwd(MD5Util.getMD5(user.getLoginPwd()));
        //设置创建时间和修改时间
        user.setCreateTime(DateUtil.formatDate(new Date()));
        user.setEditTime(DateUtil.formatDate(new Date()));
        return userDao.insert(user)>0;
    }

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return true 或 false
     */
    @Override
    public boolean edit(User user) {
        return userDao.update(user)>0;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean remove(String id) {
        return userDao.deleteById(id) > 0;
    }

    /**
     * 通过主键删除数据
     *
     * @param ids 主键
     * @return 是否成功
     */
    @Override
    public boolean removeBatch(String[] ids) {
        return userDao.deleteBatch(ids) > 0;
    }
}
